package cn.kivensoft.util;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

/** HttpService请求返回的响应类
 * @author kiven lee
 * @version 1.0
 * @since 2021-01-09
 */
public class HttpResponse {
	// 响应状态，例如 200, 404, 500等
	private final int status;
	// 响应消息，例如 OK, Not Found, Internal Server Error
	private final String message;
	// 响应内容类型，例如 application/json, html/plain, text/plain
	private final String contentType;
	// 响应头部字段，例如 Host: 1.1.1.1, Accept: application/json, Content-Length: 400
	private final Map<String, List<String>> headers;
	// 响应的body内容
	private final byte[] data;

	public HttpResponse(int status, String message, String contentType, Map<String, List<String>> headers, byte[] data) {
		this.status = status;
		this.message = message;
		this.contentType = contentType;
		this.headers = headers;
		this.data = data;
	}

	public int getStatus() {
		return status;
	}

	public String getMessage() {
		return message;
	}

	public String getContentType() {
		return contentType;
	}

	public byte[] getData() {
		return data;
	}

	public Map<String, List<String>> getHeaders() {
		return headers;
	}

	/** 返回响应头部指定键名的单个值(有多个值的时候返回第一个)
	 * @param name 头部名称
	 * @return 头部名称对应的值
	 */
	public String getHeader(String name) {
		List<String> vs = headers.get(name);
		return vs == null || vs.isEmpty() ? null : vs.get(0);
	}

	/** 返回响应头部指定键名的多个值列表
	 * @param name 键名
	 * @return 多个值列表，没有返回null
	 */
	public List<String> getHeaderList(String name) {
		return headers.get(name);
	}

	/** 对响应内容进行utf8解码，返回字符串格式
	 * @return 字符串，没有返回null
	 */
	public String getDataAsString() {
		return data == null ? null : Strings.fromBytes(data);
	}

	/** 对响应内容进行指定字符集解码，返回字符串格式
	 * @param charsetName 字符集
	 * @return 字符串，没有返回null
	 */
	public String getDataAsString(String charsetName) throws UnsupportedEncodingException {
		return data == null ? null : new String(data, charsetName);
	}

	/** 对响应内容进行json反序列化，响应内容必须为单个对象格式
	 * @return MapWrap
	 */
	public MapWrap getDataAsMap() {
		String s = getDataAsString();
		return s == null ? null : new MapWrap(JsonParse.from(s));
	}

	/** 对响应内容进行json反序列化
	 * @return String/Long/Boolean/Double/Map<String, Object>/List<Object>/null
	 */
	public <T> T json() {
		String s = getDataAsString();
		return s == null ? null : JsonParse.from(getDataAsString());
	}
}
